package handler

import (
	"Data-API-MCP/backend/internal/domain/service"
	"net/http"
	"strconv"
	"time"

	"github.com/gin-gonic/gin"
)

// APICallHandler API调用记录处理器
type APICallHandler struct {
	callService *service.APICallService
}

// NewAPICallHandler 创建API调用记录处理器
func NewAPICallHandler(callService *service.APICallService) *APICallHandler {
	return &APICallHandler{
		callService: callService,
	}
}

// GetCalls 获取API调用记录列表
// @Summary 获取API调用记录列表
// @Description 获取所有API调用记录
// @Tags API调用记录
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param offset query int false "偏移量"
// @Param limit query int false "每页数量"
// @Success 200 {array} object "API调用记录列表"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/calls [get]
func (h *APICallHandler) GetCalls(c *gin.Context) {
	offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0"))
	limit, _ := strconv.Atoi(c.DefaultQuery("limit", "10"))

	calls, err := h.callService.ListCalls(c.Request.Context(), offset, limit)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, calls)
}

// GetCall 获取单个API调用记录
// @Summary 获取单个API调用记录
// @Description 获取指定ID的API调用记录
// @Tags API调用记录
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param id path string true "调用记录ID"
// @Success 200 {object} object "API调用记录"
// @Failure 401 {object} object "未授权"
// @Failure 404 {object} object "记录不存在"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/calls/{id} [get]
func (h *APICallHandler) GetCall(c *gin.Context) {
	id := c.Param("id")
	call, err := h.callService.GetCall(c.Request.Context(), id)
	if err != nil {
		c.JSON(http.StatusNotFound, gin.H{"error": "调用记录不存在"})
		return
	}

	c.JSON(http.StatusOK, call)
}

// GetCallsByAPI 获取指定API的调用记录列表
// @Summary 获取指定API的调用记录列表
// @Description 获取指定API的所有调用记录
// @Tags API调用记录
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param apiId path string true "API ID"
// @Param offset query int false "偏移量"
// @Param limit query int false "每页数量"
// @Success 200 {array} object "API调用记录列表"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/apis/{apiId}/calls [get]
func (h *APICallHandler) GetCallsByAPI(c *gin.Context) {
	apiID := c.Param("apiId")
	offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0"))
	limit, _ := strconv.Atoi(c.DefaultQuery("limit", "10"))

	calls, err := h.callService.ListCallsByAPI(c.Request.Context(), apiID, offset, limit)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, calls)
}

// GetCallsByTimeRange 获取指定时间范围内的调用记录列表
// @Summary 获取指定时间范围内的调用记录列表
// @Description 获取指定时间范围内的所有调用记录
// @Tags API调用记录
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param startTime query string true "开始时间"
// @Param endTime query string true "结束时间"
// @Param offset query int false "偏移量"
// @Param limit query int false "每页数量"
// @Success 200 {array} object "API调用记录列表"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/calls/time-range [get]
func (h *APICallHandler) GetCallsByTimeRange(c *gin.Context) {
	startTime, err := time.Parse(time.RFC3339, c.Query("startTime"))
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的开始时间"})
		return
	}

	endTime, err := time.Parse(time.RFC3339, c.Query("endTime"))
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的结束时间"})
		return
	}

	offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0"))
	limit, _ := strconv.Atoi(c.DefaultQuery("limit", "10"))

	calls, err := h.callService.ListCallsByTimeRange(c.Request.Context(), startTime, endTime, offset, limit)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, calls)
}

// GetCallsByCaller 获取指定调用者的调用记录列表
// @Summary 获取指定调用者的调用记录列表
// @Description 获取指定调用者的所有调用记录
// @Tags API调用记录
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param caller path string true "调用者"
// @Param offset query int false "偏移量"
// @Param limit query int false "每页数量"
// @Success 200 {array} object "API调用记录列表"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/calls/caller/{caller} [get]
func (h *APICallHandler) GetCallsByCaller(c *gin.Context) {
	caller := c.Param("caller")
	offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0"))
	limit, _ := strconv.Atoi(c.DefaultQuery("limit", "10"))

	calls, err := h.callService.ListCallsByCaller(c.Request.Context(), caller, offset, limit)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, calls)
}

// GetStatistics 获取API调用统计信息
// @Summary 获取API调用统计信息
// @Description 获取指定API的调用统计信息
// @Tags API调用记录
// @Accept json
// @Produce json
// @Param Authorization header string true "Bearer 用户令牌"
// @Param apiId path string true "API ID"
// @Param startTime query string true "开始时间"
// @Param endTime query string true "结束时间"
// @Success 200 {object} object "API调用统计信息"
// @Failure 401 {object} object "未授权"
// @Failure 500 {object} object "服务器错误"
// @Router /api/v1/apis/{apiId}/statistics [get]
func (h *APICallHandler) GetStatistics(c *gin.Context) {
	apiID := c.Param("apiId")
	startTime, err := time.Parse(time.RFC3339, c.Query("startTime"))
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的开始时间"})
		return
	}

	endTime, err := time.Parse(time.RFC3339, c.Query("endTime"))
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的结束时间"})
		return
	}

	stats, err := h.callService.GetStatistics(c.Request.Context(), apiID, startTime, endTime)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, stats)
}
